/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

import dbUtil.*;
import iteradores.*;
import beans.*;
import utils.MD5;

/**
 *
 * @author Administrador
 */
public class ManejadorUsuario extends HttpServlet {
   private String nombreModulo = "usuario";
   private IteradorUsuario usuarioActual;
   
   /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("windows-1252");
        PrintWriter out = response.getWriter();
        String url = null;

        try {
            //Datos del usuario actual de la sesion, si esto es nulo significa
            //que aun no hizo login
            usuarioActual = (IteradorUsuario) request.getSession().getAttribute("usuarioActual");
            if (usuarioActual == null) {
                url = "login.jsp"; //Volver a loguearse

            } else {
                // Obtiene la conexión a la base de datos de la sesión
                Connection con = (Connection) request.getSession().getAttribute("ConexionBd");
                //Obtiene la operación a realizar 
                String str_op = request.getParameter("op");

                if (str_op != null) {
                    //Objeto que averigua si el usuario tiene permiso para acceder al servlet.
                    PgAbm testPermiso = new PgAbm();
                    testPermiso.setCon(con);

                    usuarioActual.getReset();
                    usuarioActual.getNext();
                    if (testPermiso.tienePermiso(nombreModulo,
                            usuarioActual.getNombreusuario(),
                            str_op.substring(0, 6))) {
                        
                        url = "usuario.jsp?modo=SELECT";

                        if (str_op.equals("SELECT")) {
                            url = this.select_data(con, request, response);
                        } else if (str_op.equals("INSERT")) {
                            url = this.insert_data(con, request, response);
                        } else if (str_op.equals("UPDATE")) {
                             url = this.update_data(con, request, response);
                        } else if (str_op.equals("DELETE")) {
                            url = this.delete_data(con, request, response);
                        }
                    } else {
                        url = "sinpermiso.jsp";
                    }
                } else {
                    url = "admin.jsp";
                }
            }
            mostrar_pagina(url, request, response);
        } catch (Exception e) {
            e.printStackTrace(out);
        }
    }

    public void mostrar_pagina(String url, HttpServletRequest req, HttpServletResponse resp)
            throws Exception {
        RequestDispatcher disp = req.getRequestDispatcher(url);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setCharacterEncoding("windows-1252");
        resp.setHeader("Pragma", "no-cache");
        resp.setIntHeader("Expires", 0);
        disp.forward(req, resp);
    }

    public DBConfig getDataBaseConfig() {
        ServletContext scon = getServletContext();
        DBConfig dc = new DBConfig();
        dc.setDbname(scon.getInitParameter("dbname"));
        dc.setServer(scon.getInitParameter("dbserver"));
        dc.setUser(scon.getInitParameter("dbuser"));
        dc.setPass(scon.getInitParameter("dbpass"));
        return dc;
    }

    
    //<editor-fold defaultstate="collapsed" desc="Métodos ABM (SELECT, INSERT, UPDATE y DELETE).">
    public String select_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "usuario.jsp?modo=SELECT";
        String action = request.getParameter("action");

        if ((action != null) && action.equalsIgnoreCase("do")) {
            con.setAutoCommit(false);

            Usuario usuario = new Usuario();

            usuario.setAllParams(request);

            String smode = request.getParameter("searchmode");
            if ((smode != null) && smode.equalsIgnoreCase("exact")) {
                usuario.setSearchMode(PgAbm.SEARCH_EXACT);
            } else {
                usuario.setSearchMode(PgAbm.SEARCH_APROX);
            }

            String sscope = request.getParameter("searchscope");
            if ((sscope != null) && sscope.equalsIgnoreCase("all")) {
                usuario.setSearchScope(PgAbm.SEARCH_ALL);
            } else {
                usuario.setSearchScope(PgAbm.SEARCH_SOME);
            }

            usuario.setCon(con);
            usuario.setOrderBy("apellido", PgAbm.ORD_ASC);
            usuario.load_data();
            IteradorUsuario it = (IteradorUsuario) usuario.getIterator();
            request.setAttribute("Usuarios", it);

            TipoDocumento nc = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
            if (nc == null) {
                nc = new TipoDocumento();
            }

            //Trae todos los tipos de módulos y lo coloca en una tabla.
            nc.setCon(con);
            nc.getTiposDocumentos();
            IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc.getIteratorAll();
            request.setAttribute("TiposDocumento", it2);

            request.setAttribute("beanTipoDocumento", nc);
            //Seteamos en la sesión para conservar los filtros set*
            request.getSession().setAttribute("lastBeanUsuario", usuario);
            
            url += "&modo=DONE";
        } else {
            con.setAutoCommit(false);

            TipoDocumento tipodocumento = new TipoDocumento();
            tipodocumento.setCon(con);
            tipodocumento.getTiposDocumentos();

            IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
            request.setAttribute("TiposDocumento", it);

            request.setAttribute("beanTipoDocumento", tipodocumento);

            request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);
        }

        return url;
    }

    public String insert_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "usuario.jsp?modo=INSERT";
        String action = request.getParameter("action");

        if ((action != null) && action.equalsIgnoreCase("do")) {
            con.setAutoCommit(false);
            
            //Insertamos en tabla Usuario
            Usuario usuario = new Usuario();
            usuario.setCon(con);
            usuario.setAllParams(request);
            usuario.setIdOperador(usuarioActual.getNombreusuario());
            usuario.save_data();

            /* 
             * Aplicamos nuevamente los filtros anteriores para refrescar los
             * datos en pantalla.
             */
            Usuario nc = (Usuario) request.getSession().getAttribute("lastBeanUsuario");
            if (nc == null) {
                nc = new Usuario();
            }

            nc.setCon(con);
            nc.load_data();
            IteradorUsuario it = (IteradorUsuario) nc.getIterator();
            request.setAttribute("Usuarios", it);

            TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
            if (nc2 == null) {
                nc2 = new TipoDocumento();
            }

            nc2.setCon(con);
            nc2.getTiposDocumentos();
            IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
            request.setAttribute("TiposDocumento", it2);
            request.setAttribute("beanTipoDocumento", nc2);

            url = "usuario.jsp?modo=SELECT&msg=ADDDONE";

            con.commit();
        } else {
            con.setAutoCommit(false);

            TipoDocumento tipodocumento = new TipoDocumento();
            tipodocumento.setCon(con);
            tipodocumento.getTiposDocumentos();
            IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
            request.setAttribute("TiposDocumento", it);

            request.setAttribute("beanTipoDocumento", tipodocumento);
            request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);
        }
        return url;
    }

    public String update_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url = "usuario.jsp?modo=UPDATE";

        String action = request.getParameter("action");
        String idusuario = request.getParameter("idusuario");

        Usuario nc = (Usuario) request.getSession().getAttribute("lastBeanUsuario");
        if (nc != null) {
            nc.setCon(con);
            if (idusuario != null) {
                nc.setIdUsuario(idusuario);
            }
            nc.setSearchMode(PgAbm.SEARCH_EXACT);
            nc.load_data();
            IteradorUsuario it = (IteradorUsuario) nc.getIterator();
            request.setAttribute("Usuarios", it);
        }

        if ((action != null) && action.equalsIgnoreCase("do")) {
            String str_idUsuario = request.getParameter("idusuario");

            if ((str_idUsuario != null) && (str_idUsuario.length() > 0)) {
                int idUsuario = 0;
                idUsuario = Integer.parseInt(str_idUsuario);
            } else {
                throw new Exception("El id del usuario que desea modificar no es válido.");
            }
            con.setAutoCommit(false);

            Usuario usuario = new Usuario();
            usuario.setCon(con);
            usuario.setIdUsuario(str_idUsuario);
            usuario.setAllParams(request);
            usuario.setIdOperador(usuarioActual.getNombreusuario());
            usuario.update_data();

            /* 
             * Aplicamos nuevamente los filtros anteriores para refrescar los
             * datos en pantalla.
             */
            nc = (Usuario) request.getSession().getAttribute("lastBeanUsuario");
            if (nc == null) {
                nc = new Usuario();
            }
            nc.setCon(con);
            nc.load_data();
            IteradorUsuario it = (IteradorUsuario) nc.getIterator();
            request.setAttribute("Usuarios", it);

            TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
            if (nc2 == null) {
                nc2 = new TipoDocumento();
            }

            nc2.setCon(con);
            nc2.getTiposDocumentos();
            IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
            request.setAttribute("TiposDocumento", it2);
            request.setAttribute("beanTipoDocumento", nc2);

            request.getSession().setAttribute("lastBeanTipoDocumento", nc2);

            con.commit();
            url = "usuario.jsp?modo=SELECT&msg=UPDTDONE";
        } else {
            con.setAutoCommit(false);

            TipoDocumento tipodocumento = new TipoDocumento();
            tipodocumento.setCon(con);
            tipodocumento.getTiposDocumentos();
            IteradorTipoDocumento it = (IteradorTipoDocumento) tipodocumento.getIteratorAll();
            request.setAttribute("TiposDocumento", it);

            request.setAttribute("beanTipoDocumento", tipodocumento);
            request.getSession().setAttribute("lastBeanTipoDocumento", tipodocumento);
            url = "usuario.jsp?modo=UPDATE";
        }
        return url;
    }

    public String delete_data(Connection con, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String url;
        String str_idUsuario = request.getParameter("idusuario");

        if ((str_idUsuario != null) && (str_idUsuario.length() > 0)) {
            int idUsuario = 0;
            idUsuario = Integer.parseInt(str_idUsuario);
        } else {
            throw new Exception("El id del usuario que desea eliminar no es válido.");
        }

        con.setAutoCommit(false);

        Usuario usuario = new Usuario();
        usuario.setCon(con);
        usuario.setIdUsuario(str_idUsuario);
        usuario.remove_data();
        usuario.update_data();

        /* 
         * Aplicamos nuevamente los filtros anteriores para refrescar los
         * datos en pantalla.
         */
        Usuario nc = (Usuario) request.getSession().getAttribute("lastBeanUsuario");
        if (nc == null) {
            nc = new Usuario();
        }
        nc.setCon(con);
        nc.load_data();
        IteradorUsuario it = (IteradorUsuario) nc.getIterator();
        request.setAttribute("Usuarios", it);

        TipoDocumento nc2 = (TipoDocumento) request.getSession().getAttribute("lastBeanTipoDocumento");
        if (nc2 == null) {
            nc2 = new TipoDocumento();
        }

        nc2.setCon(con);
        nc2.getTiposDocumentos();
        IteradorTipoDocumento it2 = (IteradorTipoDocumento) nc2.getIteratorAll();
        request.setAttribute("TiposDocumento", it2);
        request.setAttribute("beanTipoDocumento", nc2);

        request.getSession().setAttribute("lastBeanTipoDocumento", nc2);

        con.commit();
        url = "usuario.jsp?modo=SELECT&msg=DELDONE";

        return url;
    }
    //</editor-fold>
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void destroy() {
    }    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     */
    @Override
    public String getServletInfo() {
        return "Este servlet maneja las peticiones sobre la tabla Usuario";
    }
    // </editor-fold>
}
